home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 140 / Gekkan Dennou Club - 2000.1 Vol. 140 (Japan).7z / Gekkan Dennou Club - 2000.1 Vol. 140 (Japan) (Track 1).bin / tools / has060 / hassrc87.lzh / has.equ < prev    next >
Text File  |  1999-11-17  |  14KB  |  502 lines

  1.     .nlist
  2. ;----------------------------------------------------------------
  3. ;    X68k High-speed Assembler
  4. ;        定数・マクロ定義
  5. ;        < has.equ >
  6. ;
  7. ;    $Id: has.equ,v 1.44  1999 11/17(Wed) 03:59:32 M.Kamada Exp $
  8. ;
  9. ;        Copyright 1990-94  by Y.Nakamura
  10. ;              1996-99  by M.Kamada
  11. ;----------------------------------------------------------------
  12.  
  13.  
  14. ;----------------------------------------------------------------
  15. version        reg    '3.09+87'    ;バージョンNo.
  16. verno        equ    309        ;(@VERSIONの値)
  17. verno060    equ    87        ;__HAS060__の値
  18.  
  19.   .ifndef EUCSRC
  20. EUCSRC        equ    0        ;ソースの文字コード(0=SJIS,1=EUC)
  21.   .endif
  22.   .ifndef EUCMES
  23. EUCMES        equ    0        ;メッセージの文字コード(0=SJIS,1=EUC)
  24.   .endif
  25.   .ifndef UNIX_NEWLINE
  26. UNIX_NEWLINE    equ    0        ;メッセージの改行コード(0=$0D0A,1=$0A)
  27.   .endif
  28.  
  29. ;----------------------------------------------------------------
  30. ;    定数の定義
  31. ;----------------------------------------------------------------
  32. BELL        equ    $07
  33. TAB        equ    $09
  34. LF        equ    $0A
  35. FF        equ    $0C
  36. CR        equ    $0D
  37. EOF        equ    $1A
  38.  
  39. STDOUT        equ    1
  40. STDERR        equ    2
  41.  
  42.   .if UNIX_NEWLINE=0
  43. CRLF        reg    CR,LF
  44.   .else
  45. CRLF        reg    LF
  46.   .endif
  47.  
  48.   .if 1
  49. MASK_HASH    equ    1
  50. ;ハッシュテーブルのサイズを32768未満の2のべき乗にする
  51. SYMHASHSIZE    equ    8192    ;シンボルハッシュテーブルのサイズ
  52. CMDHASHSIZE    equ    1024    ;命令ハッシュテーブルのサイズ
  53.   .else
  54. SYMHASHSIZE    equ    10000    ;シンボルハッシュテーブルのサイズ
  55. CMDHASHSIZE    equ    1000    ;命令ハッシュテーブルのサイズ
  56.   .endif
  57.  
  58. INCLDMAXNEST    equ    8    ;インクルードファイルの最大ネスティング数
  59. MACROMAXNEST    equ    32    ;マクロ展開の最大ネスティング数
  60.  
  61. ;SYMEXTCOUNTは16の倍数にすること
  62. SYMEXTCOUNT    equ    2000    ;一度に用意するシンボルテーブル数
  63.  
  64. MAXLINELEN    equ    1024    ;一行の最大長
  65.  
  66. LOCSYMBUFSIZE    equ    16384    ;マクロ内のローカルシンボル名のバッファのサイズ
  67.                 ;(1つのマクロ定義で使えるローカルシンボルの最大サイズ)
  68.  
  69.  
  70. ;----------------------------------------------------------------
  71. ;    マクロ定義
  72. ;----------------------------------------------------------------
  73.  
  74. ;----------------------------------------------------------------
  75. ;    レジスタの値を偶数境界に合わせる
  76. doeven    .macro    reg
  77.     addq.l    #1,reg
  78.     and.b    #$FE,reg
  79.     .endm
  80.  
  81. ;----------------------------------------------------------------
  82. ;    レジスタの値をロングワード境界に合わせる
  83. doquad    .macro    reg
  84.     addq.l    #3,reg
  85.     and.b    #$FC,reg
  86.     .endm
  87.  
  88. ;----------------------------------------------------------------
  89. ;    大文字なら小文字化する
  90. tolower    .macro    reg
  91.     cmpi.b    #'Z',reg
  92.     bhi    @skip
  93.     cmpi.b    #'A',reg
  94.     bcs    @skip
  95.     ori.b    #$20,reg
  96. @skip:
  97.     .endm
  98.  
  99. ;----------------------------------------------------------------
  100. ;    68000/68010ならジャンプする
  101. bra68    .macro    reg,label
  102.     move.b    (CPUTYPE,a6),reg
  103.     andi.b    #(C000|C010)>>8,reg
  104.     bne    label
  105.     .endm
  106.  
  107. ;----------------------------------------------------------------
  108. ;    68000/68010でないならジャンプする
  109. bran68    .macro    reg,label
  110.     move.b    (CPUTYPE,a6),reg
  111.     andi.b    #(C000|C010)>>8,reg
  112.     beq    label
  113.     .endm
  114.  
  115. ;----------------------------------------------------------------
  116. ;    32bitオフセットのbsrを行う
  117. bsrl    .macro    adr,reg
  118. @currentpc:
  119.     move.l    #adr-@currentpc,reg
  120.     jsr    (@currentpc,pc,reg.l)
  121.     .endm
  122.  
  123. ;----------------------------------------------------------------
  124. ;    32ビットの相対lea
  125. llea    .macro    adr,reg
  126. @currentpc:
  127.     lea.l    (@currentpc,pc),reg
  128.     adda.l    #adr-@currentpc,reg
  129.     .endm
  130.  
  131. ;----------------------------------------------------------------
  132. ;    現在のファイルポインタ位置を得る
  133. GETFPTR    .macro    adr,reg
  134.     move.l    (F_TOPOFST+adr,a6),reg
  135.     add.l    (F_PTROFST+adr,a6),reg
  136.     .endm
  137.  
  138. ;----------------------------------------------------------------
  139. ;    EUC対応
  140. jissft    .macro    h,l
  141.     l:=l+$1F
  142.     h:=h+1
  143.   .if h.and.1
  144.     l:=l+$5E
  145.   .endif
  146.     h:=h/2
  147.   .if l>=$7F
  148.     l:=l+1
  149.   .endif
  150.     h:=h+$70
  151.   .if h>=$A0
  152.     h:=h+$40
  153.   .endif
  154.     .endm
  155.  
  156. sftjis    .macro    h,l
  157.   .if h>=$E0
  158.     h:=h-$40
  159.   .endif
  160.     h:=h-$70
  161.   .if l>=$80
  162.     l:=l-1
  163.   .endif
  164.     h:=h*2
  165.   .if l>=$9E
  166.     l:=l-$5E
  167.     h:=h+1
  168.   .endif
  169.     h:=h-1
  170.     l:=l-$1F
  171.     .endm
  172.  
  173. ;シフトJISコードで書かれた文字列をEUCコードで埋め込む
  174. eucstr    .macro    str
  175.   .irpc c,str
  176.     .if '&c'<=$FF
  177.     .dc.b    '&c'
  178.     .else
  179.     h:=('&c'>>8).and.$FF
  180.     l:='&c'.and.$FF
  181.     sftjis    h,l
  182.     .dc.b    $80+h,$80+l
  183.     .endif
  184.   .endm
  185.     .endm
  186.  
  187. mes    .macro    str
  188.   .if EUCMES=0
  189.     .dc.b    str
  190.   .else
  191.     eucstr    str
  192.   .endif
  193.     .endm
  194.  
  195. ;----------------------------------------------------------------
  196. ;    シンボル定義属性
  197. ;----------------------------------------------------------------
  198. SA_UNDEF    equ    0    ;使用されたが定義されていない
  199. SA_NODET    equ    1    ;定義されたが値が定まっていない
  200. SA_DEFINE    equ    2    ;定義されて値が定まった
  201. SA_PREDEFINE    equ    3    ;定義されて値が定まっており再定義できない
  202.  
  203.  
  204. ;----------------------------------------------------------------
  205. ;    セクションコード
  206. ;----------------------------------------------------------------
  207. SECT_ABS    equ    $00    ;定数
  208. SECT_TEXT    equ    $01    ;テキスト
  209. SECT_DATA    equ    $02    ;データ
  210. SECT_BSS    equ    $03    ;ブロックストレージ
  211. SECT_STACK    equ    $04    ;スタック
  212. SECT_RDATA    equ    $05    ;データ            (64KB以内相対)
  213. SECT_RBSS    equ    $06    ;ブロックストレージ
  214. SECT_RSTACK    equ    $07    ;スタック
  215. SECT_RLDATA    equ    $08    ;データ            (64KB以上相対)
  216. SECT_RLBSS    equ    $09    ;ブロックストレージ
  217. SECT_RLSTACK    equ    $0A    ;スタック
  218. N_SECTIONS    equ    $0A    ;セクションの数(text/data/bss/stack/rl?data/rl?bss/rl?stack)
  219.  
  220.  
  221. ;----------------------------------------------------------------
  222. ;    外部定義属性
  223. ;----------------------------------------------------------------
  224. SECT_GLOBL    equ    $FA    ;グローバル(外部参照/定義)
  225. SECT_XDEF    equ    $FB    ;外部定義
  226. SECT_RLCOMM    equ    $FC    ;コモンエリア(64KB以上相対)
  227. SECT_RCOMM    equ    $FD    ;コモンエリア(64KB以内相対)
  228. SECT_COMM    equ    $FE    ;コモンエリア
  229. SECT_XREF    equ    $FF    ;外部参照
  230.  
  231.  
  232. ;----------------------------------------------------------------
  233. ;    ファイルポインタの構造
  234. ;----------------------------------------------------------------
  235.     .offset    0
  236. F_HANDLE:    .ds.w    1    ;ファイルハンドル(オープン前なら-1)
  237. F_BUFPTR:    .ds.l    1    ;ファイルバッファへのポインタ
  238. F_BUFLEN:    .ds.l    1    ;ファイルバッファ長
  239. F_TOPOFST:    .ds.l    1    ;バッファ先頭データのオフセット
  240. F_DATALEN:    .ds.l    1    ;バッファ内のデータ長
  241. F_PTROFST:    .ds.l    1    ;次のデータのオフセット
  242. F_NAMEPTR:    .ds.l    1    ;ファイル名へのポインタ
  243. ;F_DATAPTR:    .ds.l    1    ;次のデータへのポインタ
  244. ;F_BUFLEFT:    .ds.l    1    ;未使用/未読のバッファ長
  245. F_PTRLEN:
  246.  
  247.  
  248. ;----------------------------------------------------------------
  249. ;    SCD拡張シンボルテーブルの構造
  250. ;----------------------------------------------------------------
  251.     .offset    0
  252. SCD_NAME:    .ds.b    8    ;シンボル名
  253. SCD_VAL:    .ds.l    1    ;シンボル値
  254. SCD_SECT:    .ds.w    1    ;値の存在するセクション
  255. SCD_TYPE:    .ds.w    1    ;シンボルの型
  256. SCD_SCL:    .ds.b    1    ;シンボルの記憶クラス
  257. SCD_LEN:    .ds.b    1    ;シンボルテーブルの長さ
  258. SCD_TAG:    .ds.l    1    ;構造シンボルのタグ位置
  259. SCD_SIZE:    .ds.l    1    ;シンボルのサイズ
  260. SCD_DIM:    .ds.w    2    ;配列シンボルの要素数
  261. SCD_NEXT:    .ds.l    1    ;テーブルチェイン
  262.         .ds.w    1    ;(未使用)
  263. SCD_TBLLEN:
  264.  
  265.  
  266. ;----------------------------------------------------------------
  267. ;    実効アドレス解釈バッファの内容
  268. ;----------------------------------------------------------------
  269.     .offset    0
  270. EACODE:        .ds.w    1    ;実効アドレスモードエンコード
  271. EXTCODE:    .ds.w    1    ;拡張ワード
  272. EADTYPE:    .ds.b    1    ;実効アドレスデータタイプ
  273. EAIMMCNT:    .ds.b    1    ;実効アドレスのイミディエイトデータ数(FP命令用)
  274.  
  275. RPNSIZE1:    .ds.b    1    ;式のサイズ
  276. OPTIONALPC:    .ds.b    1    ;実効アドレスのPCがoptionalならtrue
  277.     .even
  278. RPNLEN1:    .ds.w    1    ;逆ポーランド式の長さ(-1なら定数/0なら式がない)
  279. RPNBUF1:    .ds.w    128    ;逆ポーランド式バッファ/定数値
  280.  
  281. RPNSIZE2:    .ds.b    1    ;(od用)
  282.     .even
  283. RPNLEN2:    .ds.w    1    ;
  284. RPNBUF2:    .ds.w    128    ;
  285. EABUFSIZE:
  286.  
  287.  
  288. ;----------------------------------------------------------------
  289. ;    演算子コード
  290. ;----------------------------------------------------------------
  291. ;リンカに渡す演算子番号は変更不可
  292. ;単項演算子
  293. OP_NEG        equ    $01
  294. OP_POS        equ    $02
  295. OP_NOT        equ    $03
  296. OP_HIGH        equ    $04
  297. OP_LOW        equ    $05
  298. OP_HIGHW    equ    $06
  299. OP_LOWW        equ    $07
  300. OP_NUL        equ    $08
  301. ;二項演算子
  302. OP_MUL        equ    $09
  303. OP_DIV        equ    $0A
  304. OP_MOD        equ    $0B
  305. OP_SHR        equ    $0C
  306. OP_SHL        equ    $0D
  307. OP_ASR        equ    $0E
  308. OP_SUB        equ    $0F
  309. OP_ADD        equ    $10
  310. OP_EQ        equ    $11
  311. OP_NE        equ    $12
  312. OP_LT        equ    $13
  313. OP_LE        equ    $14
  314. OP_GT        equ    $15
  315. OP_GE        equ    $16
  316. OP_SLT        equ    $17
  317. OP_SLE        equ    $18
  318. OP_SGT        equ    $19
  319. OP_SGE        equ    $1A
  320. OP_AND        equ    $1B
  321. OP_XOR        equ    $1C
  322. OP_OR        equ    $1D
  323. ;以降はリンカに渡さない演算子
  324. OPNOTLK        equ    $1E
  325. ;.notb./.notw.
  326. OP_NOTB        equ    $1E
  327. OP_NOTW        equ    $1F
  328. ;.sizeof./.defined.
  329. OP_SIZEOF    equ    $20
  330. OP_DEFINED    equ    $21
  331. ;演算子の種類の数
  332. OPCOUNT        equ    $22
  333.  
  334.  
  335. ;----------------------------------------------------------------
  336. ;    $Log: has.equ,v $
  337. ;    Revision 1.44  1999 11/17(Wed) 03:59:32 M.Kamada
  338. ;    +87 tst (0,a0)+が「オペランドが多すぎます」になる
  339. ;
  340. ;    Revision 1.43  1999 10/ 8(Fri) 20:06:23 M.Kamada
  341. ;    +86 外部参照宣言したシンボルを行頭ラベルとして再定義しようとするとバスエラーになる不具合
  342. ;    +86 ilsymerrを細分化
  343. ;    +86 ilsizeerrを細分化
  344. ;    +86 浮動小数点数を含む式で+符号が使えなかった
  345. ;    +86 浮動小数点数を含む式で加算と減算が逆になっていた
  346. ;    +86 改行コードの変更に対応
  347. ;    +86 EUC対応準備
  348. ;    +86 '%s に外部参照値は指定できません'
  349. ;    +86 foo fequ fooのエラーメッセージがおかしい
  350. ;
  351. ;    Revision 1.42  1999  6/ 9(Wed) 23:35:36 M.Kamada
  352. ;    +85 .offsymでシンボル指定があるとき.even/.quad/.alignをエラーにする
  353. ;    +85 演算子!=を有効にする
  354. ;    +85 演算子.notb./.notw.を追加
  355. ;    +85 .dsの引数が負数のとき.text/.dataセクションではエラー,その他はワーニング
  356. ;
  357. ;    Revision 1.41  1999  4/28(Wed) 22:21:33 M.Kamada
  358. ;    +84 マクロ内のローカルシンボルが多すぎるとバスエラーが出る不具合を修正
  359. ;    +84 1つのマクロでローカルシンボルを254個以上登録できる
  360. ;
  361. ;    Revision 1.40  1999  3/16(Tue) 03:32:21 M.Kamada
  362. ;    +83 疑似命令のパラメータが間違っているときに多すぎると表示されることがあった
  363. ;    +83 浮動小数点数を含む式で比較と整数の演算子が使えるようにする
  364. ;    +83 -o./fooのとき.oが補完されなかった
  365. ;    +83 エラーメッセージ中の疑似命令の先頭に'.'を付ける
  366. ;    +83 数字ローカルラベルを4桁まで対応
  367. ;
  368. ;    Revision 1.39  1999  3/ 3(Wed) 14:42:55 M.Kamada
  369. ;    +82 ColdFireのときCPUSHLがアセンブルできなかった
  370. ;    +82 ハッシュテーブルのサイズを2のべき乗にしてdivuを除去
  371. ;    +82 doquadマクロ追加
  372. ;
  373. ;    Revision 1.38  1999  2/27(Sat) 23:41:58 M.Kamada
  374. ;    +81 ソースリストのフォーマットを変更(実行ファイルは+80とまったく同じ)
  375. ;
  376. ;    Revision 1.37  1999  2/23(Tue) 02:27:47 M.Kamada
  377. ;    +80 ColdFire対応
  378. ;    +80 lleaマクロ追加
  379. ;    +80 .sizeof.と.defined.を追加
  380. ;
  381. ;    Revision 1.36  1999  2/11(Thu) 02:49:05 M.Kamada
  382. ;    +79 .dcの個別のサイズ指定で.w/.l以外を指定したときの挙動がおかしい
  383. ;
  384. ;    Revision 1.35  1998 11/19(Thu) 22:01:56 M.Kamada
  385. ;    +78 -k0と-nを併用すると誤動作するため後から指定した方を有効にする
  386. ;
  387. ;    Revision 1.34  1998 10/10(Sat) 00:51:53 M.Kamada
  388. ;    +77 -pのとき.INSERTで1度に256バイト以上読み出すと誤動作する
  389. ;
  390. ;    Revision 1.33  1998  8/26(Wed) 13:27:30 M.Kamada
  391. ;    +76 マクロ内ローカルシンボル@~を2個以上定義すると誤動作する
  392. ;
  393. ;    Revision 1.32  1998  8/22(Sat) 15:45:47 M.Kamada
  394. ;    +75 数字ローカルラベルが定義できなくなっていた
  395. ;
  396. ;    Revision 1.31  1998  8/20(Thu) 23:18:41 M.Kamada
  397. ;    +74 マクロ定義中の@~を自動的にローカル宣言する
  398. ;
  399. ;    Revision 1.30  1998  8/19(Wed) 00:22:30 M.Kamada
  400. ;    +73 .dcのデータに個別にサイズを指定できる
  401. ;
  402. ;    Revision 1.29  1998  8/18(Tue) 19:35:57 M.Kamada
  403. ;    +72 .sizemの第2引数のローカルシンボルにマクロの引数の個数を定義する
  404. ;
  405. ;    Revision 1.28  1998  8/ 2(Sun) 16:30:34 M.Kamada
  406. ;    +71 -1のときFMOVE FPn,<label>がエラーになる
  407. ;
  408. ;    Revision 1.27  1998  7/29(Wed) 02:33:11 M.Kamada
  409. ;    +70 .INSERTの引数に10進数以外の数値を指定したときの不具合を修正
  410. ;
  411. ;    Revision 1.26  1998  7/14(Tue) 01:20:12 M.Kamada
  412. ;    +68 .insertを追加
  413. ;    +69 プレデファインシンボル__HAS__と__HAS060__を追加
  414. ;
  415. ;    Revision 1.25  1998  7/ 5(Sun) 20:43:47 M.Kamada
  416. ;    +67 STOP/LPSTOP #<data> で無意味なビットが立っていたらワーニングを出す
  417. ;
  418. ;    Revision 1.24  1998  5/24(Sun) 19:42:22 M.Kamada
  419. ;    +66 ANDI to SR/CCRで未定義ビットをクリアしようとしたらワーニングを出す
  420. ;    +66 -y[n]のnを書くと常に-y0になる不具合を修正
  421. ;
  422. ;    Revision 1.22  1998  4/13(Mon) 04:17:36 M.Kamada
  423. ;    +64 move An,USPの行にラベルがあるとI11対策が行われない
  424. ;
  425. ;    Revision 1.21  1998  3/31(Tue) 02:03:17 M.Kamada
  426. ;    +61 MOVE #<imm>,SR/CCR で無意味なビットが立っていたらワーニングを出す
  427. ;    +62 MOVEP.L (d,An),Dnの展開にSWAPを使う
  428. ;    +63 jmp/jsrを最適化する
  429. ;
  430. ;    Revision 1.20  1998  3/27(Fri) 06:30:06 M.Kamada
  431. ;    +60 .OFFSETセクションでDSの引数に行頭のシンボルを使えないバグ
  432. ;
  433. ;    Revision 1.19  1998  2/ 8(Sun) 00:59:50 M.Kamada
  434. ;    +59 jbra/jbsr/jbccにサイズを指定できる
  435. ;
  436. ;    Revision 1.18  1998  1/25(Sun) 21:15:12 M.Kamada
  437. ;    +58 逆条件ニモニックとelifを追加
  438. ;
  439. ;    Revision 1.17  1998  1/24(Sat) 17:11:40 M.Kamada
  440. ;    +57 バージョン変更
  441. ;
  442. ;    Revision 1.16  1998  1/ 9(Fri) 22:21:42 M.Kamada
  443. ;    +56 バージョン変更
  444. ;
  445. ;    Revision 1.15  1998  1/ 3(Sat) 22:33:19 M.Kamada
  446. ;    +55 バージョン変更
  447. ;
  448. ;    Revision 1.15  1997 11/23(Sun) 16:00:01 M.Kamada
  449. ;    +99 バージョン変更
  450. ;        バージョン変更
  451. ;
  452. ;    Revision 1.14  1997  9/15(Mon) 15:29:52 M.Kamada
  453. ;    +45 アセンブル条件追加
  454. ;
  455. ;    Revision 1.13  1997  9/14(Sun) 02:55:29 M.Kamada
  456. ;    +99 バージョン変更
  457. ;        バージョン変更
  458. ;
  459. ;    Revision 1.12  1997  6/24(Tue) 21:56:16 M.Kamada
  460. ;    +34 プレデファインシンボルの定義属性SA_PREDEFINEを追加
  461. ;
  462. ;    Revision 1.11  1997  6/24(Tue) 17:53:21 M.Kamada
  463. ;    +99 バージョン変更
  464. ;        バージョン変更
  465. ;
  466. ;    Revision 1.10  1994/07/28  12:43:42  nakamura
  467. ;    若干のバグ修正
  468. ;
  469. ;    Revision 1.9  1994/07/08  16:00:42  nakamura
  470. ;    コメントキャラクタ,データサイズ追加
  471. ;    link命令の最適化処理追加
  472. ;    バグフィックス など
  473. ;
  474. ;    Revision 1.8  1994/06/09  14:20:04  nakamura
  475. ;    バグ修正,シンボルに使用できる文字の拡張('$')。
  476. ;
  477. ;    Revision 1.7  1994/04/25  14:35:12  nakamura
  478. ;    若干のバグ修正
  479. ;
  480. ;    Revision 1.6  1994/04/09  14:07:36  nakamura
  481. ;    若干のバグ修正。
  482. ;    jbra/jbsr/jb<cc>命令で絶対ロング以外のアドレッシングを使用可能にした。
  483. ;
  484. ;    Revision 1.5  1994/03/10  16:15:18  nakamura
  485. ;    次の命令へのブランチを削除すると暴走するバグを修正
  486. ;
  487. ;    Revision 1.4  1994/03/01  13:57:50  nakamura
  488. ;    バグフィックスおよび仕様拡張
  489. ;
  490. ;    Revision 1.3  1994/02/24  12:16:02  nakamura
  491. ;    *** empty log message ***
  492. ;
  493. ;    Revision 1.2  1994/02/20  14:52:20  nakamura
  494. ;    *** empty log message ***
  495. ;
  496. ;    Revision 1.1  1994/02/13  14:32:56  nakamura
  497. ;    Initial revision
  498. ;
  499. ;
  500.     .text
  501.     .list
  502.